Lab 1 - Wprowadzenie do ROS - struktury danych

Logotyp PP Logo IRIM

Metody i algorytmy planowania ruchu - laboratorium

Lab 1 - Wprowadzenie do Robot Operating System - struktury danych w planowaniu ruchu i wyświetlanie w RViz

humble

1. Instalacja środowiska

Na zajęciach będziemy używali systemu Linux (Ubuntu 22.04) i Robot Operating System w wersji 2. Wspieraną wersją ROSa dla Ubuntu 22.04 jest Humble Hawksbill. Środowisko ROS2 trzeba zainstalować na swoim komputerze, a instrukcja instalacji znajduje się tutaj: https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html

Po instalacji konieczna jest konfiguracja przestrzeni roboczej (workspace):

https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools/Configuring-ROS2-Environment.html

2. Wprowadzenie

ROS jest meta-systemem operacyjnym dla robotów o otwartych źródłach. Podobnie jak w systemie operacyjnym dostarczane są np. narzędzia pozwalające na komunikację ze sprzętem i sterowanie niskopoziomowe, komunikację pomiędzy procesami (węzłami) oraz zarządzanie pakietami.

Więcej informacji oraz tutoriale można znaleźć na stronie: https://docs.ros.org/en/humble/Tutorials.html

⚠️ Na komputerach w laboratorium przestrzeń robocza (katalog ~/ros2_ws) może być czyszczony przy starcie systemu. Jeżeli zamierzasz zrestartować komputer, zrób kopię zapasową swoich danych z tego katalogu.

⚠️ Dane na komputerze przechowuj w katalogu ~/Documents.

⚠️ Komputery w laboratorium są używane do wielu zajęć i prac dyplomowych. W przypadku uszkodzenia przywracana jest wersja z kopii zapasowej. Wszystkie dane są wtedy usuwane.

Podczas zajęć zamierzamy używać wielu terminali do uruchamiania poleceń ROSa. Ponieważ przełączanie pomiędzy oknami nie jest efektywne, rekomendujemy trzy inne podejścia:

3. Uruchomienie Robot Operating System

W ROS2 nie ma potrzeby uruchamiania centralnego modułu w stylu roscore (ROS Master). Wystarczy skonfigurować środowisko ROS za pomocą polecenia:

source /opt/ros/humble/setup.bash

aby móc korzystać z globalnie zainstalowanych paczek/modułów.

Chcąc pracować w lokalnym środowisku (workspace), wystarczy przejść do odpowiedniej przestrzeni roboczej ROS:

cd ~/ros2_ws

i (jeśli workspace był już zbudowany) skonfigurować środowisko poleceniem:

source install/setup.bash

⚠️ Pamiętaj, aby w każdym nowym terminalu zanim rozpoczniesz pracę skonfigurować środowisko ROS komendą
source /opt/ros/humble/setup.bash lub source install/setup.bash

Należy to robić w każdym nowy terminalu lub zakładce. W kolejnym terminalu uruchom poniższe polecenie, aby sprawdzić czy ROS działa poprawnie:

ros2 topic list

Powinna pojawić się lista aktywnych topików.

4. Przykładowe struktury danych w planowaniu ruchu

4.1 Mapy zajętości

Zainstaluj paczkę ros-humble-nav2-map-server:

sudo apt-get install ros-humble-nav2-map-server ros-humble-nav2-bringup python3-vcstool

Następnie pobierz repozytorium, które zawiera przykładowe mapy:

cd ~/ros2_ws/src

git clone --branch humble https://github.com/dominikbelter/example_maps

Skompiluj wszystkie paczki znajdujące się w przestrzeni roboczej:

cd ~/ros2_ws/

colcon build --symlink-install

Jeżeli kompilacja zakończyła się sukcesem, można uruchomić serwer, który udostępnia mapę zajętości:

ros2 run nav2_map_server map_server --ros-args --params-file src/example_maps/param/map_server_params.yaml

W osobnym terminalu:

ros2 lifecycle set /map_server configure

ros2 lifecycle set /map_server activate

⚠️ Jeśli pojawia się błąd dot. pliku YAML, należy otworzyć plik src/example_maps/param/map_server_params.yaml w edytorze tekstu i sprawdzić, czy parametr (ścieżka) yaml_filename jest odpowiednio ustawiony (trzeba dopasować nazwę użytkownika w ścieżce).

Server map_server wczytuje mapę zdefiniowaną w pliku src/example_maps/maps/map_home.yaml i udostępnia ją w topiku o nazwie /map. Mapę można wyświetlić w terminalu za pomocą polecenia:

ros2 topic echo /map

Kolejne liczby w mapie określają komórki zajęte (100), wolne (0) i nieznane (-1). Mapę można również wyświetlić w programie przeznaczonym do wizualizacji RViz:

ros2 run rviz2 rviz2

Wizualizację można dodać za pomocą przycisku “Add” znajdującym się w lewym dolnym rogu ekranu:

humble

Pojawi się okno pokazane poniżej, w którym trzeba wybrać odpowiedni topik:

humble

Po wybraniu odpowiedniego topika należy zmienić domyślne ustawienia Reliability Policy i Durablility Policy w zakładce Map / Topic na następujące:

humble

a mapa pojawi się w oknie RViz:

humble

Możliwe jest przybliżanie i obracanie mapy za pomocą klawiszy myszy.

4.2 Mapy kosztów

Wczytaną wcześniej mapę wykorzystamy do uzyskania mapy kosztów. Każda komórka w mapie kosztów będzie reprezentowała koszt przebywania robota w danym miejscu. Oczywiście będzie on najwyższy dla przeszkód. Do konwersji mapy zajętości na mapę kosztów wykorzystamy gotowy węzeł nav2_costmap_2d. Węzeł ten służy do obliczania mapy kosztów na mapach 2D.

Na początku należy uruchomić moduł wczytujący mapę z dysku:

ros2 run nav2_map_server map_server --ros-args --params-file src/example_maps/param/map_server_params.yaml

i go skonfigurować:

ros2 lifecycle set /map_server configure

Moduł do obliczenia mapy kosztu uruchamiamy poleceniem:

ros2 run nav2_costmap_2d nav2_costmap_2d

Konieczne jest również publikowanie przekształcenia pomiędzy robotem (base_link) i mapą (map):

ros2 run tf2_ros static_transform_publisher 0 0 0 0 0 0 map base_link

Konieczna jest również konfiguracja modułu:

ros2 lifecycle set /costmap/costmap configure

Pojawi się topik reprezentujący globalną mapę kosztów (/costmap/costmap).

🔨 Zadanie 4.2.1

Wyświetlić globalną mapę kosztów w RViz. Po ustawieniu topików w Rviz, pamiętaj o aktywowaniu modułu poleceniem:

ros2 lifecycle set /costmap/costmap activate

Później aktywuj moduł map_server:

ros2 lifecycle set /map_server activate

Oczekiwany efekt wygląda następująco:

humble

🔨 Zadanie 4.2.2

Zmodyfikować sposób wyświetlania mapy kosztów (parametr “Color Scheme”). Oczekiwany efekt wygląda następująco:

humble

🔨 Zadanie 4.2.3

Korzystając z komend w terminalu odczytaj bieżące wartości dwóch parametrów w węźle /costmap/costmap:

Zmień wartości tych parametrów w trakcie działania węzła i zaobserwuj efekt w Rvizie.

5. Uruchomienie budowy mapy z wykorzystaniem biblioteki Octomap

System budowy mapy z wykorzystaniem modułu Octomap opisany jest na stronie: https://octomap.github.io/

W mapie typu Octomap przestrzeń podzielona jest na komórki 3D (woksele). Każdy z nich zawiera informację o prawdopodobieństwie zajętości. Aby uruchomić bibliotekę Octomap, należy ją wcześniej zainstalować z repozytorium:

sudo apt-get install ros-humble-octomap ros-humble-octomap-server python3-vcstool

Potrzebny nam będzie również model robota Turtlebot:

sudo apt-get install ros-humble-turtlebot3*

Następnie pobierzemy repozytorium zawierające skrypty uruchomieniowe oraz przykładowe mapy:

cd ~/ros2_ws/src

git clone --branch humble https://github.com/dominikbelter/example_maps

git clone https://github.com/iKrishneel/octomap_server2.git

cd octomap_server2 && vcs import . < deps.repos

Skompiluj wszystkie paczki znajdujące się w przestrzeni roboczej:

cd ~/ros2_ws/
colcon build --symlink-install

⚠️ W przypadku błędu w kompilacji:

fatal error: message_filters/message_event.hpp: No such file or directory
   44 | #include <message_filters/message_event.hpp>

należy przejść do katalogu /home/student/ros2_ws/src/perception_pcl i cofnąć się do jednego z wcześniejszych commitów:

git checkout -b new_branch 44d02743e451296d6bc871b101cea33c59adc1d6

Jeżeli kompilacja zakończyła się sukcesem, należy zmodyfikować model robota Turtlebot3, tak aby korzystał z kamery głębi. W tym celu otworzyć plik:

sudo gedit /opt/ros/humble/share/turtlebot3_gazebo/models/turtlebot3_waffle/model.sdf

I dokonać zmian w liniach:

line 369:    <sensor name="camera" type="depth">
line 400:    <frame_name>camera_rgb_optical_frame</frame_name>

Teraz można uruchomić symulację robota Turtlebot3 wraz z systemem do budowy mapy (wszystkie uruchamiane moduły oraz ich parametry znajdują się w pliku ~/ros2_ws/src/example_maps/launch/turtlesim3_waffle_octomap.launch.py):

source install/setup.bash

export TURTLEBOT3_MODEL=waffle

ros2 launch example_maps turtlesim3_waffle_octomap.launch.py

Do sterowania robotem wykorzystamy moduł turtlebot3_teleop (w osobnym terminalu):

cd ~/ros2_ws

source install/setup.bash

export TURTLEBOT3_MODEL=waffle

ros2 run turtlebot3_teleop teleop_keyboard

Sterowanie robotem odbywa się za pomocą klawiszy ‘a’, ‘s’, ‘d’, ‘w’, ‘x’. Podczas poruszania się robota powstaje mapa 3D Octomap.

Oczekiwany wynik jest następujący:

humble

🔨 Zadanie 5.1

Zmodyfikuj plik launch uruchamiający symulację (~/ros2_ws/src/example_maps/launch/turtlesim3_waffle_octomap.launch.py), tak żeby wielkość komórki wynosiła 10 cm.

Oczekiwany wynik:

humble